const BrowserManager = require('../../newbrowser');
const path = require('path');
const os = require('os');

// 创建公共配置，使用用户主目录
const getManagerOptions = () => {
  const homeDir = os.homedir();
  return {
    userDataDir: path.join(homeDir,"newbrowserdata", '.browser-profiles'),
    configFile: path.join(homeDir,"newbrowserdata", '.browser-manager-config.json')
  };
};

module.exports = (program) => {
  // 默认命令 - 无参数时执行 CLI
  program
    .arguments('[profile]')
    .description('启动交互式命令行界面，可以指定URL')
    .option('-u, --url <url>', '设置服务器URL', 'http://localhost:8080')
    .action(async (profile, options) => {
      const url = options.url;
      // 使用用户主目录的配置
      const manager = new BrowserManager(getManagerOptions());
      manager.setServerUrl(url);
      // 如果有profile参数，启动浏览器，否则启动CLI
      if (profile) {
        const launchedProfile = manager.launchBrowserInstance(profile);
        if (launchedProfile) {
          console.log(`浏览器实例已启动，配置: ${launchedProfile}`);
        } else {
          console.log('启动浏览器实例失败，请确认Chrome浏览器是否已安装');
        }
      } else {
        // 没有profile参数时，启动CLI
        console.log(`启动浏览器管理器CLI，默认打开URL：${url}`);
        manager.startCLI();
      }
    });

  // 启动浏览器实例
  program 
    .command('launch <profile>')
    .description('启动新的Chrome实例，可指定配置名称')
    .option('-u, --url <url>', '默认打开URL', 'http://localhost:8080')
    .action((profile, options) => {
      // 直接从process.argv解析-u参数，这是备用方法
      const urlArg = process.argv.indexOf('-u');
      const urlArgLong = process.argv.indexOf('--url');
      let customUrl = null;
      
      if (urlArg > -1 && urlArg + 1 < process.argv.length) {
        customUrl = process.argv[urlArg + 1];
      } else if (urlArgLong > -1 && urlArgLong + 1 < process.argv.length) {
        customUrl = process.argv[urlArgLong + 1];
      }
      
      // 使用用户主目录的配置
      const manager = new BrowserManager(getManagerOptions());
      
      // 优先使用手动解析的URL参数
      if (customUrl && !customUrl.startsWith('-')) {
        console.log(`使用命令行指定的URL: ${customUrl}`);
        manager.setServerUrl(customUrl);
      } else if (options.url && options.url !== 'http://localhost:8080') {
        // 如果Commander成功解析了非默认URL
        console.log(`使用指定的URL: ${options.url}`);
        manager.setServerUrl(options.url);
      } else {
        // 使用默认URL
        console.log(`使用默认URL: ${options.url}`);
        manager.setServerUrl(options.url);
      }
      
      const launchedProfile = manager.launchBrowserInstance(profile);
      if (launchedProfile) {
        console.log(`浏览器实例已启动，配置: ${launchedProfile}`);
      } else {
        console.log('启动浏览器实例失败，请确认Chrome浏览器是否已安装');
      }
    });

  // 列出所有配置和实例
  program
    .command('list')
    .description('列出所有浏览器配置和实例')
    .action(async () => {
      // 使用用户主目录的配置
      const manager = new BrowserManager(getManagerOptions());
      
      // 获取当前运行的实例
      const instances = await manager.getAllRunningInstances();
      
      // 获取配置文件列表
      const profiles = manager.getAllProfiles();
      
      // 显示浏览器实例和配置信息
      console.log('\n浏览器配置和实例:');
      
      if (profiles.length === 0) {
        console.log('  没有找到任何配置文件');
      } else {
        const lastUsedProfile = manager.getLastUsedProfile();
        
        profiles.forEach((profileName, index) => {
          const isLastUsed = profileName === lastUsedProfile;
          const prefix = isLastUsed ? '* ' : '  ';
          const instance = instances.find(inst => inst.profileName === profileName);
          
          console.log(`${prefix}${index + 1}. ${profileName}${isLastUsed ? ' (上次使用)' : ''}`);
          
          if (instance) {
            const createdAt = new Date(instance.createdAt).toLocaleTimeString();
            console.log(`     状态: 运行中, PID: ${instance.pid}, 启动时间: ${createdAt}`);
            console.log(`     用户数据路径: ${instance.userDataPath}`);
          } else {
            console.log('     无运行实例');
          }
          console.log(''); // 添加空行分隔
        });
      }
      
      console.log(`当前运行实例: ${instances.length}`);
    });

  // 显示所有配置文件
  program
    .command('profiles')
    .description('列出所有可用的浏览器配置')
    .action(() => {
      // 使用用户主目录的配置
      const manager = new BrowserManager(getManagerOptions());
      const profiles = manager.getAllProfiles();
      const lastUsedProfile = manager.getLastUsedProfile();
      
      console.log('\n可用的浏览器配置:');
      
      if (profiles.length === 0) {
        console.log('  没有找到任何配置文件');
      } else {
        profiles.forEach((profileName, index) => {
          const isLastUsed = profileName === lastUsedProfile;
          const profilePath = manager.getProfilePath(profileName);
          
          console.log(`${isLastUsed ? '* ' : '  '}${index + 1}. ${profileName}`);
          console.log(`     路径: ${profilePath}`);
        });
      }
      
      console.log('\n使用 "newbrowser launch [配置名称]" 启动指定配置');
    });

  // 停止所有实例
  program
    .command('stopall')
    .description('停止所有浏览器实例')
    .action(async () => {
      // 使用用户主目录的配置
      const manager = new BrowserManager(getManagerOptions());
      const count = await manager.closeAllInstances();
      
      if (count > 0) {
        console.log(`已关闭 ${count} 个浏览器实例`);
      } else {
        console.log('没有需要关闭的浏览器实例');
      }
    });

  // 停止指定配置的实例
  program
    .command('stop <profile>')
    .description('停止指定配置名称的浏览器实例')
    .action(async (profileName) => {
      // 使用用户主目录的配置
      const manager = new BrowserManager(getManagerOptions());
      const success = await manager.stopBrowserInstance(profileName);
      
      if (success) {
        console.log(`已停止配置 ${profileName} 的浏览器实例`);
      } else {
        console.log(`未找到配置 ${profileName} 的运行实例或停止失败`);
      }
    });

  // 删除配置
  program
    .command('delete <profile>')
    .description('删除指定的配置目录')
    .action(async (profileName) => {
      // 使用用户主目录的配置
      const manager = new BrowserManager(getManagerOptions());
      
      // 先检查是否有实例在运行
      const instances = await manager.getAllRunningInstances();
      const runningInstance = instances.find(inst => inst.profileName === profileName);
      
      if (runningInstance) {
        console.log(`错误: 配置 "${profileName}" 有正在运行的实例，请先停止它`);
        return;
      }
      
      const success = manager.deleteProfile(profileName);
      if (success) {
        console.log(`已删除配置目录: ${profileName}`);
      } else {
        console.log(`删除配置 ${profileName} 失败或不存在`);
      }
    });

  // CLI模式
  program
    .command('cli')
    .arguments('[profile]')
    .description('启动交互式命令行界面')
    .option('-u, --url <url>', '默认打开URL', 'http://localhost:8080')
    .action((profile,cmdObj,{ parent }) => {
      let opt = parent?.opts()
      console.log(`启动浏览器管理器CLI，默认打开URL：${opt.url}`);
      // 使用用户主目录的配置
      const manager = new BrowserManager(getManagerOptions());
      manager.setServerUrl(opt.url).setProfile(profile).startCLI();
    });
};
